package com.cj.tool.http;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.Toast;

import com.cj.tool.http.dialog.ProgressCancelListener;
import com.cj.tool.http.dialog.ProgressDialogHandler;
import com.cj.tool.utils.LogUtil;
import com.cj.tool.utils.NetUtils;
import com.google.gson.JsonSyntaxException;

import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.concurrent.TimeoutException;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━感觉萌萌哒━━━━━━
 * <p>
 * Created by yi on 2020/9/9.
 */
public abstract class BaseObserver<T> implements Observer<T>, ProgressCancelListener {

    public static final String TAG = "BaseObserver";

    private Activity activity;
    private Disposable disposable;
    private boolean isShowDialog;
    private ProgressDialogHandler mProgressDialogHandler;

    public BaseObserver(Activity activity, boolean isShowDialog) {
        this.activity = activity;
        this.isShowDialog = isShowDialog;
        mProgressDialogHandler = new ProgressDialogHandler(activity,
                this, true);
    }

    public BaseObserver(Activity activity) {
        this.activity = activity;
    }

    public Disposable getDisposable() {
        return disposable;
    }

    @Override
    public void onSubscribe(Disposable d) {
        try {
            disposable = d;
            if (isShowDialog) {
                showProgressDialog();
            }
            if (activity.isFinishing()) return;
            if (!NetUtils.isNetworkConnected(activity)) {
                onComplete();
                LogUtil.e("设备没有网络");
                Toast.makeText(activity, "设备没有网络", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onError(Throwable e) {
        try {
            //错误处理
            if (e instanceof TimeoutException || e instanceof SocketTimeoutException
                    || e instanceof ConnectException) {
                LogUtil.e(TAG, "请求超时");

            } else if (e instanceof JsonSyntaxException) {
                //假如导致这个异常触发的原因是服务器的问题，那么应该让服务器知道，所以可以在这里
                //选择上传原始异常描述信息给服务器
                LogUtil.e(TAG, e.getMessage());
                LogUtil.e(TAG, "JSON解析错误");

            } else if (e instanceof HttpTimeException) {
                if (!TextUtils.isEmpty(e.getMessage())) {
                    LogUtil.e(e.getMessage());
                }

            } else {
                if (!TextUtils.isEmpty(e.getMessage())) {
                    LogUtil.e(e.getMessage());
                }
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            dismissProgressDialog();
        }
    }

    @Override
    public void onComplete() {
        try {
            dismissProgressDialog();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onCancelProgress() {
        try {
            dismissProgressDialog();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void showProgressDialog() {
        if (mProgressDialogHandler != null) {
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.SHOW_PROGRESS_DIALOG).sendToTarget();
        }
    }

    private void dismissProgressDialog() {
        if (mProgressDialogHandler != null) {
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.DISMISS_PROGRESS_DIALOG).sendToTarget();
            mProgressDialogHandler = null;
            if (activity != null) {
                activity = null;
            }
            if (disposable != null) {
                //取消弹窗的时候，取消请求
                disposable.dispose();
                disposable = null;
            }
        }
    }
}
